All files / util promise.ts

100% Statements 13/13
100% Branches 0/0
100% Functions 6/6
100% Lines 11/11
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62                                                            2x         2493x 2493x 2493x 2493x     2x                 2x         352x 352x 1438x   352x    
/**
 * Copyright 2017 Google Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
 
import { AnyDuringMigration } from './misc';
 
export interface Resolver<R> {
  (value?: R | Promise<R>): void;
}
 
export interface Rejecter {
  (reason?: Error): void;
}
 
export interface CancelablePromise<T> extends Promise<T> {
  cancel(): void;
}
 
export class Deferred<R> {
  promise: Promise<R>;
  resolve: Resolver<R>;
  reject: Rejecter;
 
  constructor() {
    this.promise = new Promise((resolve: Resolver<R>, reject: Rejecter) => {
      this.resolve = resolve;
      this.reject = reject;
    });
  }
}
 
/**
 * Takes an array of values and sequences them using the promise (or value)
 * returned by the supplied callback. The callback for each item is called
 * after the promise is resolved for the previous item.
 * The function returns a promise which is resolved after the promise for
 * the last item is resolved.
 */
export function sequence<T, R>(
  values: T[],
  fn: (value: T, result?: R) => R | Promise<R>,
  initialValue?: R
): Promise<R> {
  let result = Promise.resolve(initialValue);
  values.forEach(value => {
    result = result.then(lastResult => fn(value, lastResult));
  });
  return result as AnyDuringMigration;
}